
 1000  *--------------------------------
 1010  *SAVE S.RANDOM KEYIN
 1020  *--------------------------------
 1030  *      ALLOWS ACCESS TO THE KEYIN RANDOM VALUE
 1040  *--------------------------------
 1050         .OR $300
 1060         .TF B.RANDOM KEYIN
 1070  *--------------------------------
 1080  NORMALIZE.FAC       .EQ $E82E
 1090  FMUL.FAC.BY.YA      .EQ $E97F
 1100  STORE.FAC.AT.YX.ROUNDED .EQ $EB2B
 1110  AS.QINT             .EQ $EBF2
 1120  AS.INT              .EQ $EC23
 1130  *--------------------------------
 1140  USER.VECTOR         .EQ $0A THRU $0C
 1150  FAC                 .EQ $9D THRU $A2
 1160  FAC.SIGN            .EQ $A2
 1170  FAC.EXTENSION       .EQ $AC
 1180  KEY.SEED            .EQ $4E,4F
 1190  *--------------------------------
 1200  LINK   LDA #$4C     "JMP" OPCODE
 1210         STA USER.VECTOR
 1220         LDA #RANDOM
 1230         STA USER.VECTOR+1
 1240         LDA /RANDOM
 1250         STA USER.VECTOR+2
 1260         RTS
 1270  *--------------------------------
 1280  *      R = USR (X)
 1290  *      IF X < 0 THEN RESEED WITH ABS(X)
 1300  *      IF X = 0 THEN R = REPEAT OF PREVIOUS VALUE
 1310  *      IF 0 < X < 2 THEN GENERATE NEXT SEED AND RETURN
 1320  *                    0 <= R < 1
 1330  *      IF X >= 2 THEN R = INT(RND*X)
 1340  *--------------------------------
 1350  RANDOM
 1360         LDA FAC.SIGN CHECK FOR RESEEDING
 1370         BMI .1       ...YES
 1380         LDA FAC      CHECK FOR X=0
 1390         BEQ .6       ...YES, REUSE LAST NUMBER
 1400  *---X --> RANGE------------------
 1410         LDX #RANGE
 1420         LDY /RANGE
 1430         JSR STORE.FAC.AT.YX.ROUNDED   $EB2B
 1440         JMP .4
 1450  *---PREPARE SEED-----------------
 1460  .1     LDA #0       MAKE SEED POSITIVE
 1470         STA FAC.SIGN
 1480         LDA FAC      LIMIT SEED TO 2^16-1
 1490         CMP #$90
 1500         BCC .2
 1510         LDA #$90
 1520         STA FAC
 1530  .2     JSR AS.QINT   $EBF2
 1540         LDA FAC+3
 1550         STA KEY.SEED
 1560         LDA FAC+4
 1570         STA KEY.SEED+1
 1580  *---SEED*19125+13843-------------
 1590  .4     LDX #0
 1600  .5     LDA KEY.SEED,X
 1610         STA MULTIPLIER
 1620         LDA C,X
 1630         STA KEY.SEED,X
 1640         JSR MULTIPLY
 1650         INX
 1660         CPX #2
 1670         BCC .5
 1680  *---LOAD SEED INTO FAC-----------
 1690  .6     LDA #0
 1700         STA FAC+3
 1710         STA FAC+4
 1720         STA FAC.SIGN
 1730         STA FAC.EXTENSION
 1740         LDA #$80
 1750         STA FAC
 1760         LDA KEY.SEED
 1770         STA FAC+1
 1780         LDA KEY.SEED+1
 1790         STA FAC+2
 1800         JSR NORMALIZE.FAC
 1810  *---SCALE TEST-------------------
 1820         LDA RANGE
 1830         CMP #$82     IS RANGE BETWEEN ZERO AND ONE?
 1840         BCC .8       ...YES
 1850  *---SCALE------------------------
 1860         LDA #RANGE
 1870         LDY /RANGE
 1880         JSR FMUL.FAC.BY.YA   $E97F
 1890         JSR AS.INT  $EC23
 1900  *---RETURN-----------------------
 1910  .8     RTS
 1920  *--------------------------------
 1930  MULTIPLY
 1940         STX BYTE.CNT
 1950         LDY #1
 1960  .1     LDA A,Y
 1970         STA MULTIPLICAND,X
 1980         DEY
 1990         DEX
 2000         BPL .1
 2010         LDY #8
 2020         BNE .2       ...ALWAYS
 2030  *--------------------------------
 2040  .5     CLC          DOUBLE THE MULTIPLICAND
 2050  .6     ROL MULTIPLICAND,X
 2060         DEX
 2070         BPL .6
 2080  .2     LSR MULTIPLIER
 2090         BCC .4
 2100         LDX BYTE.CNT
 2110         CLC
 2120  .3     LDA MULTIPLICAND,X
 2130         ADC KEY.SEED,X
 2140         STA KEY.SEED,X
 2150         DEX
 2160         BPL .3
 2170  .4     LDX BYTE.CNT
 2180         DEY
 2190         BNE .5
 2200         RTS
 2210  *--------------------------------
 2220  RANGE          .HS 81.00000000
 2230  A              .DA /19125,#19125
 2240  C              .DA /13843,#13843
 2250  MULTIPLIER     .BS 1
 2260  MULTIPLICAND   .BS 2
 2270  BYTE.CNT       .BS 1
 2280  *--------------------------------

